from shutil import copyfile
import os


def render_book_line(book_object):
    book = book_object
    book['rating'] = '?' if not 'rating' in book else book['rating']
    book['url'] = '' if not 'url' in book else book['url']
    book['year'] = '' if not 'year' in book else book['year']
    return '| {} | {} | [{}]({}) | {} |  \n'.format(book['title'],
                                                   book['author'],
                                                   book['rating'],
                                                   book['url'],
                                                   book['year'])


# TODO: refine this logic
def render(in_file, out_file, library):
    """
    This renders the file to the out_file location
    savig the new file to tmp_file location, the copying it to out-file and deleting tmp_file
    this is done to prevent issues if the in and the out file are the same
    """
    tmp_file = './.tmp-file.md'
    open(tmp_file, 'a').close()
    books_not_reached = True
    with open(tmp_file, 'w') as out_file_tmp:
        with open(in_file) as original_file:
            for line in original_file:

                if line.strip() in library:
                    if not books_not_reached: out_file_tmp.write('\n')
                    books_not_reached = False

                    # render chapter and start of the table
                    out_file_tmp.write(line)
                    if len(library[line.strip()]) > 0:
                        out_file_tmp.write('| Name | Author | Goodreads Rating | Year Published |  \n')
                        out_file_tmp.write('|------|--------|------------------|----------------|  \n')
                    # render books
                    for book in library[line.strip()]:
                        out_file_tmp.write(render_book_line(book))
                elif books_not_reached:
                    out_file_tmp.write(line)
                elif line.startswith('## License'):
                    out_file_tmp.write('\n')
                    out_file_tmp.write('\n')
                    out_file_tmp.write(line)
                    books_not_reached = True

    copyfile(tmp_file, out_file)
    os.remove(tmp_file)